/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*	Copyright (c) 1988 AT&T	*/
/*	  All Rights Reserved  	*/


#ifndef _FORM_H
#define	_FORM_H

#include <curses.h>
#include <eti.h>

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * FIELDTYPE
 */

typedef struct typenode {

	int			status;		/* flags		*/
	int			ref;		/* reference count	*/
	struct typenode *	left;		/* ptr to operand for |	*/
	struct typenode *	right;		/* ptr to operand for |	*/
	PTF_charP		makearg;	/* make fieldtype arg	*/
	PTF_charP		copyarg;	/* copy fieldtype arg	*/
	PTF_void		freearg;	/* free fieldtype arg	*/
	PTF_int			fcheck;		/* field validation	*/
	PTF_int			ccheck;		/* character validation	*/
	PTF_int			next;		/* enumerate next value	*/
	PTF_int			prev;		/* enumerate prev value	*/
}
	FIELDTYPE;

/*
 * _PAGE
 */

typedef struct {

	int			pmin;		/* first field on page	*/
	int			pmax;		/* last field on page	*/
	int			smin;		/* top leftmost field	*/
	int			smax;		/* bottom rightmost	*/
}
	_PAGE;

/*
 * FIELD
 */

typedef struct fieldnode {

	int			status;		/* flags		*/
	int			rows;		/* size in rows		*/
	int			cols;		/* size in cols		*/
	int			frow;		/* first row		*/
	int			fcol;		/* first col		*/
	int			drows;		/* dynamic rows		*/
	int			dcols;		/* dynamic cols		*/
	int			maxgrow;	/* maximum field growth */
	int			nrow;		/* offscreen rows	*/
	int			nbuf;		/* additional buffers	*/
	int			just;		/* justification	*/
	int			page;		/* page on form		*/
	int			index;		/* into form -> field	*/
	int			pad;		/* pad character	*/
	chtype			fore;		/* foreground attribute	*/
	chtype			back;		/* background attribute	*/
	OPTIONS			opts;		/* options		*/
	struct fieldnode *	snext;		/* sorted order pointer	*/
	struct fieldnode *	sprev;		/* sorted order pointer	*/
	struct fieldnode *	link;		/* linked field chain	*/
	struct formnode *	form;		/* containing form	*/
	FIELDTYPE *		type;		/* field type		*/
	char *			arg;		/* argument for type	*/
	char *			buf;		/* field buffers	*/
	char *			usrptr;		/* user pointer		*/
}
	FIELD;

/*
 * FORM
 */

typedef struct formnode {

	int			status;		/* flags		*/
	int			rows;		/* size in rows		*/
	int			cols;		/* size in cols		*/
	int			currow;		/* current row		*/
	int			curcol;		/* current col		*/
	int			toprow;		/* in vertically	*/
						/* scrollable field	*/
	int			begincol;	/* in horizontally	*/
						/* scrollable field	*/
	int			maxfield;	/* number of fields	*/
	int			maxpage;	/* number of pages	*/
	int			curpage;	/* index into page	*/
	OPTIONS			opts;		/* options		*/
	WINDOW *		win;		/* window		*/
	WINDOW *		sub;		/* subwindow		*/
	WINDOW *		w;		/* window		*/
	FIELD **		field;		/* field [maxfield]	*/
	FIELD *			current;	/* current field	*/
	_PAGE *			page;		/* page [maxpage]	*/
	char *			usrptr;		/* user pointer		*/
	PTF_void		forminit;	/* user function	*/
	PTF_void		formterm;	/* user function	*/
	PTF_void		fieldinit;	/* user function	*/
	PTF_void		fieldterm;	/* user function	*/
}
	FORM;

/*
 * miscellaneous #defines
 */

/*
 *	field justification
 */
#define	NO_JUSTIFICATION	0
#define	JUSTIFY_LEFT		1
#define	JUSTIFY_CENTER		2
#define	JUSTIFY_RIGHT		3
/*
 *	field options
 */
#define	O_VISIBLE		0x0001
#define	O_ACTIVE		0x0002
#define	O_PUBLIC		0x0004
#define	O_EDIT			0x0008
#define	O_WRAP			0x0010
#define	O_BLANK			0x0020
#define	O_AUTOSKIP		0x0040
#define	O_NULLOK		0x0080
#define	O_PASSOK		0x0100
#define	O_STATIC		0x0200
/*
 *	form options
 */
#define	O_NL_OVERLOAD		0x0001
#define	O_BS_OVERLOAD		0x0002
/*
 *	form driver commands
 */
#define	REQ_NEXT_PAGE	(KEY_MAX + 1)	/* move to next page		*/
#define	REQ_PREV_PAGE	(KEY_MAX + 2)	/* move to previous page	*/
#define	REQ_FIRST_PAGE	(KEY_MAX + 3)	/* move to first page		*/
#define	REQ_LAST_PAGE	(KEY_MAX + 4)	/* move to last page		*/

#define	REQ_NEXT_FIELD	(KEY_MAX + 5)	/* move to next field		*/
#define	REQ_PREV_FIELD	(KEY_MAX + 6)	/* move to previous field	*/
#define	REQ_FIRST_FIELD	(KEY_MAX + 7)	/* move to first field		*/
#define	REQ_LAST_FIELD	(KEY_MAX + 8)	/* move to last field		*/
#define	REQ_SNEXT_FIELD	(KEY_MAX + 9)	/* move to sorted next field	*/
#define	REQ_SPREV_FIELD	(KEY_MAX + 10)	/* move to sorted prev field	*/
#define	REQ_SFIRST_FIELD (KEY_MAX + 11)	/* move to sorted first field	*/
#define	REQ_SLAST_FIELD	(KEY_MAX + 12)	/* move to sorted last field	*/
#define	REQ_LEFT_FIELD	(KEY_MAX + 13)	/* move to left to field	*/
#define	REQ_RIGHT_FIELD	(KEY_MAX + 14)	/* move to right to field	*/
#define	REQ_UP_FIELD	(KEY_MAX + 15)	/* move to up to field		*/
#define	REQ_DOWN_FIELD	(KEY_MAX + 16)	/* move to down to field	*/

#define	REQ_NEXT_CHAR	(KEY_MAX + 17)	/* move to next char in field	*/
#define	REQ_PREV_CHAR	(KEY_MAX + 18)	/* move to prev char in field	*/
#define	REQ_NEXT_LINE	(KEY_MAX + 19)	/* move to next line in field	*/
#define	REQ_PREV_LINE	(KEY_MAX + 20)	/* move to prev line in field	*/
#define	REQ_NEXT_WORD	(KEY_MAX + 21)	/* move to next word in field	*/
#define	REQ_PREV_WORD	(KEY_MAX + 22)	/* move to prev word in field	*/
#define	REQ_BEG_FIELD	(KEY_MAX + 23)	/* move to first char in field	*/
#define	REQ_END_FIELD	(KEY_MAX + 24)	/* move after last char in fld	*/
#define	REQ_BEG_LINE	(KEY_MAX + 25)	/* move to beginning of line	*/
#define	REQ_END_LINE	(KEY_MAX + 26)	/* move after last char in line	*/
#define	REQ_LEFT_CHAR	(KEY_MAX + 27)	/* move left in field		*/
#define	REQ_RIGHT_CHAR	(KEY_MAX + 28)	/* move right in field		*/
#define	REQ_UP_CHAR	(KEY_MAX + 29)	/* move up in field		*/
#define	REQ_DOWN_CHAR	(KEY_MAX + 30)	/* move down in field		*/

#define	REQ_NEW_LINE	(KEY_MAX + 31)	/* insert/overlay new line	*/
#define	REQ_INS_CHAR	(KEY_MAX + 32)	/* insert blank char at cursor	*/
#define	REQ_INS_LINE	(KEY_MAX + 33)	/* insert blank line at cursor	*/
#define	REQ_DEL_CHAR	(KEY_MAX + 34)	/* delete char at cursor	*/
#define	REQ_DEL_PREV	(KEY_MAX + 35)	/* delete char before cursor	*/
#define	REQ_DEL_LINE	(KEY_MAX + 36)	/* delete line at cursor	*/
#define	REQ_DEL_WORD	(KEY_MAX + 37)	/* delete line at cursor	*/
#define	REQ_CLR_EOL	(KEY_MAX + 38)	/* clear to end of line		*/
#define	REQ_CLR_EOF	(KEY_MAX + 39)	/* clear to end of field	*/
#define	REQ_CLR_FIELD	(KEY_MAX + 40)	/* clear entire field		*/
#define	REQ_OVL_MODE	(KEY_MAX + 41)	/* begin overlay mode		*/
#define	REQ_INS_MODE	(KEY_MAX + 42)	/* begin insert mode		*/

#define	REQ_SCR_FLINE	(KEY_MAX + 43)	/* scroll field forward a line	*/
#define	REQ_SCR_BLINE	(KEY_MAX + 44)	/* scroll field backward a line	*/
#define	REQ_SCR_FPAGE	(KEY_MAX + 45)	/* scroll field forward a page	*/
#define	REQ_SCR_BPAGE	(KEY_MAX + 46)	/* scroll field backward a page	*/
#define	REQ_SCR_FHPAGE	(KEY_MAX + 47)	/* scroll field forward half page */
#define	REQ_SCR_BHPAGE	(KEY_MAX + 48)	/* scroll field backward half page */

#define	REQ_SCR_FCHAR	(KEY_MAX + 49)	/* horizontal scroll char */
#define	REQ_SCR_BCHAR	(KEY_MAX + 50)	/* horizontal scroll char */
#define	REQ_SCR_HFLINE	(KEY_MAX + 51)	/* horizontal scroll line */
#define	REQ_SCR_HBLINE	(KEY_MAX + 52)	/* horizontal scroll line */
#define	REQ_SCR_HFHALF	(KEY_MAX + 53)	/* horizontal scroll half line */
#define	REQ_SCR_HBHALF	(KEY_MAX + 54)	/* horizontal scroll half line */

#define	REQ_VALIDATION	(KEY_MAX + 55)	/* validate field		*/
#define	REQ_NEXT_CHOICE	(KEY_MAX + 56)	/* display next field choice	*/
#define	REQ_PREV_CHOICE	(KEY_MAX + 57)	/* display prev field choice	*/

#define	MIN_FORM_COMMAND (KEY_MAX + 1)	/* used by form_driver		*/
#define	MAX_FORM_COMMAND (KEY_MAX + 57)	/* used by form_driver		*/

/*
 *  standard field types
 */

extern FIELDTYPE *	TYPE_ALPHA;
extern FIELDTYPE *	TYPE_ALNUM;
extern FIELDTYPE *	TYPE_ENUM;
extern FIELDTYPE *	TYPE_INTEGER;
extern FIELDTYPE *	TYPE_NUMERIC;
extern FIELDTYPE *	TYPE_REGEXP;

/*
 *  default objects
 */

extern FORM *		_DEFAULT_FORM;
extern FIELD *		_DEFAULT_FIELD;

#ifdef __STDC__

/*
 *  FIELDTYPE routines
 */

extern FIELDTYPE *	new_fieldtype(PTF_int, PTF_int);
extern FIELDTYPE *	link_fieldtype(FIELDTYPE *, FIELDTYPE *);
extern int		free_fieldtype(FIELDTYPE *);
extern int		set_fieldtype_arg(FIELDTYPE *, PTF_charP,
					    PTF_charP, PTF_void);
extern int		set_fieldtype_choice(FIELDTYPE *, PTF_int, PTF_int);

/*
 *  FIELD routines
 */

extern FIELD *		new_field(int, int, int, int, int, int);
extern FIELD *		dup_field(FIELD *, int, int);
extern FIELD *		link_field(FIELD *, int, int);
extern int		free_field(FIELD *);
extern int		field_info(FIELD *, int *, int *, int *, int *,
			    int *, int *);
extern int		dynamic_field_info(FIELD *, int *, int *, int *);
extern int		set_max_field(FIELD *, int);
extern int		move_field(FIELD *, int, int);
extern int		set_field_type(FIELD *, FIELDTYPE *, ...);
extern FIELDTYPE *	field_type(FIELD *);
extern char *		field_arg(FIELD *);
extern int		set_new_page(FIELD *, int);
extern int		new_page(FIELD *);
extern int		set_field_just(FIELD *, int);
extern int		field_just(FIELD *);
extern int		set_field_fore(FIELD *, chtype);
extern chtype		field_fore(FIELD *);
extern int		set_field_back(FIELD *, chtype);
extern chtype		field_back(FIELD *);
extern int		set_field_pad(FIELD *, int);
extern int		field_pad(FIELD *);
extern int		set_field_buffer(FIELD *, int, char *);
extern char *		field_buffer(FIELD *, int);
extern int		set_field_status(FIELD *, int);
extern int		field_status(FIELD *);
extern int		set_field_userptr(FIELD *, char *);
extern char *		field_userptr(FIELD *);
extern int		set_field_opts(FIELD *, OPTIONS);
extern OPTIONS		field_opts(FIELD *);
extern int		field_opts_on(FIELD *, OPTIONS);
extern int		field_opts_off(FIELD *, OPTIONS);
extern int		field_index(FIELD *);

/*
 *  FORM routines
 */

extern FORM *		new_form(FIELD **);
extern int		free_form(FORM *);
extern int		set_form_fields(FORM *, FIELD **);
extern FIELD **		form_fields(FORM *);
extern int		field_count(FORM *);
extern int		set_form_win(FORM *, WINDOW *);
extern WINDOW *		form_win(FORM *);
extern int		set_form_sub(FORM *, WINDOW *);
extern WINDOW *		form_sub(FORM *);
extern int		set_current_field(FORM *, FIELD *);
extern FIELD *		current_field(FORM *);
extern int		set_form_page(FORM *, int);
extern int		form_page(FORM *);
extern int		scale_form(FORM *, int *, int *);
extern int		set_form_init(FORM *, PTF_void);
extern PTF_void		form_init(FORM *);
extern int		set_form_term(FORM *, PTF_void);
extern PTF_void		form_term(FORM *);
extern int		set_field_init(FORM *, PTF_void);
extern PTF_void		field_init(FORM *);
extern int		set_field_term(FORM *, PTF_void);
extern PTF_void		field_term(FORM *);
extern int		post_form(FORM *);
extern int		unpost_form(FORM *);
extern int		pos_form_cursor(FORM *);
extern int		form_driver(FORM *, int);
extern int		set_form_userptr(FORM *, char *);
extern char *		form_userptr(FORM *);
extern int		set_form_opts(FORM *, OPTIONS);
extern OPTIONS		form_opts(FORM *);
extern int		form_opts_on(FORM *, OPTIONS);
extern int		form_opts_off(FORM *, OPTIONS);
extern int		data_ahead(FORM *);
extern int		data_behind(FORM *);

#else	/* old style extern's */

/*
 *  FIELDTYPE routines
 */

extern FIELDTYPE *	new_fieldtype();
extern FIELDTYPE *	link_fieldtype();
extern int		free_fieldtype();
extern int		set_fieldtype_arg();
extern int		set_fieldtype_choice();

/*
 *  FIELD routines
 */

extern FIELD *		new_field();
extern FIELD *		dup_field();
extern FIELD *		link_field();
extern int		free_field();
extern int		field_info();
extern int		dynamic_field_info();
extern int		set_max_field();
extern int		move_field();
extern int		set_field_type();
extern FIELDTYPE *	field_type();
extern char *		field_arg();
extern int		set_new_page();
extern int		new_page();
extern int		set_field_just();
extern int		field_just();
extern int		set_field_fore();
extern chtype		field_fore();
extern int		set_field_back();
extern chtype		field_back();
extern int		set_field_pad();
extern int		field_pad();
extern int		set_field_buffer();
extern char *		field_buffer();
extern int		set_field_status();
extern int		field_status();
extern int		set_field_userptr();
extern char *		field_userptr();
extern int		set_field_opts();
extern OPTIONS		field_opts();
extern int		field_opts_on();
extern int		field_opts_off();
extern int		field_index();

/*
 *  FORM routines
 */

extern FORM *		new_form();
extern int		free_form();
extern int		set_form_fields();
extern FIELD **		form_fields();
extern int		field_count();
extern int		set_form_win();
extern WINDOW *		form_win();
extern int		set_form_sub();
extern WINDOW *		form_sub();
extern int		set_current_field();
extern FIELD *		current_field();
extern int		set_form_page();
extern int		form_page();
extern int		scale_form();
extern int		set_form_init();
extern PTF_void		form_init();
extern int		set_form_term();
extern PTF_void		form_term();
extern int		set_field_init();
extern PTF_void		field_init();
extern int		set_field_term();
extern PTF_void		field_term();
extern int		post_form();
extern int		unpost_form();
extern int		pos_form_cursor();
extern int		form_driver();
extern int		set_form_userptr();
extern char *		form_userptr();
extern int		set_form_opts();
extern OPTIONS		form_opts();
extern int		form_opts_on();
extern int		form_opts_off();
extern int		data_ahead();
extern int		data_behind();

#endif	/* __STDC__ */

#ifdef	__cplusplus
}
#endif

#endif	/* _FORM_H */
